home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / emacs.lha / emacs-19.16 / lisp / echistory.el < prev    next >
Lisp/Scheme  |  1993-06-11  |  6KB  |  150 lines

  1. ;;; echistory.el --- Electric Command History Mode
  2.  
  3. ;; Copyright (C) 1985 Free Software Foundation, Inc.
  4.  
  5. ;; Author: K. Shane Hartman
  6. ;; Maintainer: FSF
  7.  
  8. ;; This file is part of GNU Emacs.
  9.  
  10. ;; GNU Emacs is free software; you can redistribute it and/or modify
  11. ;; it under the terms of the GNU General Public License as published by
  12. ;; the Free Software Foundation; either version 2, or (at your option)
  13. ;; any later version.
  14.  
  15. ;; GNU Emacs is distributed in the hope that it will be useful,
  16. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. ;; GNU General Public License for more details.
  19.  
  20. ;; You should have received a copy of the GNU General Public License
  21. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  22. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  
  24. ;;; Code:
  25.  
  26. (require 'electric)            ; command loop
  27. (require 'chistory)            ; history lister
  28.  
  29. ;;;###autoload
  30. (defun Electric-command-history-redo-expression (&optional noconfirm)
  31.   "Edit current history line in minibuffer and execute result.
  32. With prefix arg NOCONFIRM, execute current line as-is without editing."
  33.   (interactive "P")
  34.   (let (todo)
  35.     (save-excursion
  36.       (set-buffer "*Command History*")
  37.       (beginning-of-line)
  38.       (setq todo (read (current-buffer)))
  39.       (if (boundp 'electric-history-in-progress)
  40.       (if todo (throw 'electric-history-quit (list noconfirm todo)))))))
  41.  
  42. (defvar electric-history-map ())
  43. (if electric-history-map
  44.     ()
  45.   (setq electric-history-map (make-sparse-keymap))
  46.   (define-key electric-history-map [t] 'Electric-history-undefined)
  47.   (define-key electric-history-map "\e" (make-sparse-keymap))
  48.   (define-key electric-history-map [?\e t] 'Electric-history-undefined)
  49.   (define-key electric-history-map "\C-u" 'universal-argument)
  50.   (define-key electric-history-map " " 'Electric-command-history-redo-expression)
  51.   (define-key electric-history-map "!" 'Electric-command-history-redo-expression)
  52.   (define-key electric-history-map "\e\C-x" 'eval-sexp)
  53.   (define-key electric-history-map "\e\C-d" 'down-list)
  54.   (define-key electric-history-map "\e\C-u" 'backward-up-list)
  55.   (define-key electric-history-map "\e\C-b" 'backward-sexp)
  56.   (define-key electric-history-map "\e\C-f" 'forward-sexp)
  57.   (define-key electric-history-map "\e\C-a" 'beginning-of-defun)
  58.   (define-key electric-history-map "\e\C-e" 'end-of-defun)
  59.   (define-key electric-history-map "\e\C-n" 'forward-list)
  60.   (define-key electric-history-map "\e\C-p" 'backward-list)
  61.   (define-key electric-history-map "q" 'Electric-history-quit)
  62.   (define-key electric-history-map "\C-c" nil)
  63.   (define-key electric-history-map "\C-c\C-c" 'Electric-history-quit)
  64.   (define-key electric-history-map "\C-]" 'Electric-history-quit)
  65.   (define-key electric-history-map "\C-z" 'suspend-emacs)
  66.   (define-key electric-history-map (char-to-string help-char) 'Helper-help)
  67.   (define-key electric-history-map "?" 'Helper-describe-bindings)
  68.   (define-key electric-history-map "\e>" 'end-of-buffer)
  69.   (define-key electric-history-map "\e<" 'beginning-of-buffer)
  70.   (define-key electric-history-map "\n" 'next-line)
  71.   (define-key electric-history-map "\r" 'next-line)
  72.   (define-key electric-history-map "\177" 'previous-line)  
  73.   (define-key electric-history-map "\C-n" 'next-line)
  74.   (define-key electric-history-map "\C-p" 'previous-line)
  75.   (define-key electric-history-map "\ev" 'scroll-down)
  76.   (define-key electric-history-map "\C-v" 'scroll-up)
  77.   (define-key electric-history-map [home] 'beginning-of-buffer)
  78.   (define-key electric-history-map [down] 'next-line)
  79.   (define-key electric-history-map [up] 'previous-line)
  80.   (define-key electric-history-map [prior] 'scroll-down)
  81.   (define-key electric-history-map [next] 'scroll-up)
  82.   (define-key electric-history-map "\C-l" 'recenter)
  83.   (define-key electric-history-map "\e\C-v" 'scroll-other-window))
  84.  
  85. (defvar electric-command-history-hook nil
  86.   "If non-nil, its value is called by `electric-command-history'.")
  87.  
  88. (defun electric-command-history ()
  89.   "\\<electric-history-map>Major mode for examining and redoing commands from `command-history'.
  90. This pops up a window with the Command History listing.
  91. The number of command listed is controlled by `list-command-history-max'.
  92. The command history is filtered by `list-command-history-filter' if non-nil.
  93. Combines typeout Command History list window with menu like selection
  94. of an expression from the history for re-evaluation in the *original* buffer.
  95.  
  96. The history displayed is filtered by `list-command-history-filter' if non-nil.
  97.  
  98. Like Emacs-Lisp mode except that characters do not insert themselves and
  99. Tab and Linefeed do not indent.  Instead these commands are provided:
  100. \\{electric-history-map}
  101.  
  102. Calls the value of `electric-command-history-hook' if that is non-nil.
  103. The Command History listing is recomputed each time this mode is invoked."
  104.   (interactive)
  105.   (let ((electric-history-in-progress t)
  106.     (old-buffer (current-buffer))
  107.     (todo))
  108.     (unwind-protect
  109.     (setq todo
  110.           (catch 'electric-history-quit
  111.         (save-window-excursion
  112.           (save-window-excursion
  113.             (list-command-history)
  114.             (set-buffer "*Command History*")
  115.             (Command-history-setup 'electric-command-history
  116.                        "Electric History"
  117.                        electric-history-map))
  118.           (Electric-pop-up-window "*Command History*")
  119.           (run-hooks 'electric-command-history-hook)
  120.           (if (eobp)
  121.               (progn (ding)
  122.                  (message "No command history.")
  123.                  (throw 'electric-history-quit nil))
  124.             (let ((Helper-return-blurb "return to History"))
  125.               (Electric-command-loop 'electric-history-quit
  126.                          "->" t))))))
  127.       (set-buffer "*Command History*")
  128.       (Command-history-setup)
  129.       (bury-buffer (current-buffer)))
  130.     (if (consp todo)
  131.     (progn (set-buffer old-buffer)
  132.            (if (car todo)
  133.            (apply (car (car (cdr todo))) (cdr (car (cdr todo))))
  134.          (edit-and-eval-command "Redo: " (car (cdr todo))))))))
  135.  
  136. (defun Electric-history-undefined ()
  137.   (interactive)
  138.   (ding)
  139.   (message (substitute-command-keys "Type \\[Help-for-help] for help, ? for commands, C-c to quit, Space to execute"))
  140.   (sit-for 4))
  141.  
  142. (defun Electric-history-quit ()
  143.   "Quit Electric Command History, restoring previous window configuration."
  144.   (interactive)
  145.   (if (boundp 'electric-history-in-progress)
  146.       (progn (message "")
  147.          (throw 'electric-history-quit nil))))
  148.  
  149. ;;; echistory.el ends here
  150.